package webCam;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */




import funciones.Medico;
import funciones.PacienteCita;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JFrame;


/**
 *
 * @author Jesus Ruiz Oliva
 */
public class ControllerCamaraWeb implements ActionListener,
            MouseListener, MouseMotionListener {
    
    private VistaWebCam vistaWebCam = null;
    private Camara  webCam = null;
    private Dimension dimension = null;
    private ArrayList<String> arrayFotos;
    private JFrame jFrame;
    
    public  ControllerCamaraWeb(VistaWebCam vistaWebCam,Camara webCam,ArrayList<String> arrayFotos,JFrame jFrame){
        this.vistaWebCam = vistaWebCam;
        this.webCam = webCam;
        this.webCam.configurarCam();
        this.arrayFotos = arrayFotos;
        this.jFrame = jFrame;
        //this.webCam.start();
        this.dimension = this.webCam.verDimensionImage();
        this.vistaWebCam.setComponent(this.webCam.getVisualComponent());
        this.vistaWebCam.getIniciarCamara().setEnabled(true);
        vistaWebCam.getSeleccionarArea().setEnabled(false);
        this.vistaWebCam.getJPanel1().setSize(dimension);
        this.vistaWebCam.getJPanel2().setSize(dimension);
    }

    @Override
    public void actionPerformed(ActionEvent evento) {
        if (evento.getSource()==vistaWebCam.getSeleccionarArea()){
            vistaWebCam.getPanelDobleBuffer().setStateButton(1);
            webCam.stop();
            vistaWebCam.getSeleccionarArea().setEnabled(false);

        } if (evento.getSource()==vistaWebCam.getIniciarCamara()) {
            // Validate Area
            if ((vistaWebCam.getPanelDobleBuffer().getAreaX() > 0) 
                    && (vistaWebCam.getPanelDobleBuffer().getAreaY() > 0)
                    && (vistaWebCam.getPanelDobleBuffer().getAreaWidth() > 0) 
                    && (vistaWebCam.getPanelDobleBuffer().getAreaHeight() > 0)) {
            vistaWebCam.getPanelDobleBuffer().setStateButton(0);
            }
            webCam.start();
            vistaWebCam.getPanelDobleBuffer().add(webCam.getVisualComponent());
            vistaWebCam.getIniciarCamara().setEnabled(false);
            vistaWebCam.getSeleccionarArea().setEnabled(true);
            
        } if (evento.getSource()==vistaWebCam.getAtras()){ 
            webCam.parar();
            jFrame.dispose();
        } if (evento.getSource() == vistaWebCam.getGuardar()){
            Image img;
            img = vistaWebCam.getJPanelImpl().getImagen();
            
            if (img != null){
               /* //Creamos componente
                JFileChooser chooser = new JFileChooser();
                //Cuadro para salvar archivo
                int seleccion=chooser.showSaveDialog(null);
                //Establecemos el directorio base por defecto
                chooser.setCurrentDirectory(null);//Espera seleccion
                //Si le hemos dado a aceptar
                if (seleccion == JFileChooser.APPROVE_OPTION){
                    //Obtiene ruta indicada
                    File archivo = chooser.getSelectedFile();
                    //Obtenemos el String para añadirle la extension
                    String imagen = archivo.getAbsolutePath();
                    //Añadimos extension JPEG
                    imagen = imagen+".JPG";
                    //Creamos un archivo en la ruta y con el nombre indicado
                    File imagenArch = new File(imagen);
                    String formato = "JPEG";
                    try {
                        //Grabamos la imagen pasandole la imagen, el formato y la ubicacion de nuestro archivo
                        BufferedImage bufferedImage = ImageToBufferedImage(img,img.getWidth(null),img.getHeight(null));
                        ImageIO.write(bufferedImage,formato,imagenArch);
                    } catch (IOException ex) {                            
                        Logger.getLogger(Camara.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }  */
                String path=getClass().getResource("/imagenesTemporales/").toString();
                path = path.substring(6);//getResource devuelve la ruta con la cabecera "file:/"
                path= path.replace("%20", " ");//Ademas sustituye los espacios por "%20"                
                String fecha=new Long(new Date().getTime()).toString();
                path =path+ fecha+".JPG";
                //Creamos un archivo en la ruta y con el nombre indicado
                    File imagenArch = new File(path);
                    String formato = "JPEG";
                    try {
                        //Grabamos la imagen pasandole la imagen, el formato y la ubicacion de nuestro archivo
                        BufferedImage bufferedImage = ImageToBufferedImage(img,img.getWidth(null),img.getHeight(null));
                        ImageIO.write(bufferedImage,formato,imagenArch);
                        arrayFotos.add(path);                       
                    } catch (IOException ex) {                            
                        Logger.getLogger(Camara.class.getName()).log(Level.SEVERE, null, ex);
                    }
                
                
            }
        }
        
    }
    private BufferedImage ImageToBufferedImage(Image image, int width, int height){
        BufferedImage dest = new BufferedImage(
            width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = dest.createGraphics();
        g2.drawImage(image, 0, 0, null);
        g2.dispose();
        return dest;
    }
    
    public void mousePressed(MouseEvent e) {
        e.consume();
        if (vistaWebCam.getPanelDobleBuffer().getStateButton() == 1) {
            vistaWebCam.getPanelDobleBuffer().setAreaX(e.getX());
            vistaWebCam.getPanelDobleBuffer().setAreaY(e.getY());
            vistaWebCam.getPanelDobleBuffer().setAreaWidth(0);
            vistaWebCam.getPanelDobleBuffer().setAreaHeight(0);
            vistaWebCam.getPanelDobleBuffer().repaint();
            vistaWebCam.getJPanel1().updateUI();
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        e.consume();
        if (vistaWebCam.getPanelDobleBuffer().getStateButton() == 1) {
            
            if ((int)dimension.getWidth() < e.getX()){
                vistaWebCam.getPanelDobleBuffer().setAreaWidth((int)dimension.getWidth() - vistaWebCam.getPanelDobleBuffer().getAreaX());
            }    
            else if (e.getX() < 0){
                vistaWebCam.getPanelDobleBuffer().setAreaWidth(0 - vistaWebCam.getPanelDobleBuffer().getAreaX());
            }
            else{
                vistaWebCam.getPanelDobleBuffer().setAreaWidth(e.getX() - vistaWebCam.getPanelDobleBuffer().getAreaX());
            }
            
            if ((int)dimension.getHeight() < e.getY()){                
                vistaWebCam.getPanelDobleBuffer().setAreaHeight((int)dimension.getHeight() - vistaWebCam.getPanelDobleBuffer().getAreaY());
            }
            else if (e.getY() < 0){
                vistaWebCam.getPanelDobleBuffer().setAreaHeight(0 - vistaWebCam.getPanelDobleBuffer().getAreaY());
            }
            else{
                vistaWebCam.getPanelDobleBuffer().setAreaHeight(e.getY() - vistaWebCam.getPanelDobleBuffer().getAreaY());
            }
            
            vistaWebCam.getPanelDobleBuffer().repaint();
            webCam.CapturaFoto();
            vistaWebCam.getJPanel2().removeAll();
            vistaWebCam.mostrarFoto(webCam.verFoto());
            vistaWebCam.getJPanel2().updateUI();
            vistaWebCam.getIniciarCamara().setEnabled(true);
            vistaWebCam.getJPanel1().updateUI();
        }
    }
    @Override
    public void mouseDragged(MouseEvent e) {
        e.consume();
        if (vistaWebCam.getPanelDobleBuffer().getStateButton() == 1) {
            
            if ((int)dimension.getWidth() < e.getX()){
                vistaWebCam.getPanelDobleBuffer().setAreaWidth((int)dimension.getWidth() - vistaWebCam.getPanelDobleBuffer().getAreaX());
            }    
            else if (e.getX() < 0){
                vistaWebCam.getPanelDobleBuffer().setAreaWidth(0 - vistaWebCam.getPanelDobleBuffer().getAreaX());
            }
            else{
                vistaWebCam.getPanelDobleBuffer().setAreaWidth(e.getX() - vistaWebCam.getPanelDobleBuffer().getAreaX());
            }
            
            if ((int)dimension.getHeight() < e.getY()){                
                vistaWebCam.getPanelDobleBuffer().setAreaHeight((int)dimension.getHeight() - vistaWebCam.getPanelDobleBuffer().getAreaY());
            }
            else if (e.getY() < 0){
                vistaWebCam.getPanelDobleBuffer().setAreaHeight(0 - vistaWebCam.getPanelDobleBuffer().getAreaY());
            }
            else{
                vistaWebCam.getPanelDobleBuffer().setAreaHeight(e.getY() - vistaWebCam.getPanelDobleBuffer().getAreaY());
            }
            
            vistaWebCam.getPanelDobleBuffer().repaint();
            vistaWebCam.getJPanel1().updateUI();
        }
    }

    @Override
    public void mouseMoved(MouseEvent e) {
    }
    @Override
    public void mouseClicked(MouseEvent e) {
    }
    @Override
    public void mouseEntered(MouseEvent e) {
    }
    @Override
    public void mouseExited(MouseEvent e) {
    }
        
}
